﻿1. 报文格式
{
	17+dlen = 11+len
	len = dlen + 6
	每包len长度最大1024，不能超过，超过由主站分包读取
	
																								 10+Len
	0  1  2     3     7   9   11 12   14			16	 16+Dlen
	85 5A DTYPE DAddr seq Len C  Addr DLen(2) Data CS
	
	欧式环控器  = 为包头，固定为欧式环控器
	DTYPE       = 设备类型, 1字节, 欧式环控器 固定为 0
	DAddr       = 设备地址, 4字节, 如地址为 999(0x3E7), DAddr = 0xE7 0x03 0x00 0x00
	seq 				= 帧序号, 2字节, 为帧序列号
	Len         = 长度,2字节,  为 C 到 CS(包含)的长度
	Addr			  = 为地址，2字节, 如地址是 123 (0x7B) ,Addr = 0x7B 0x00
	DLen(2Byte) = 为 Data 的长度
	CS 为 85 + 5A + Num0 + ... + Data 最后1个字节 的 8位数(高位舍弃)的校验和
	
	C 为控制码，最高位为0表示主动发出方，最高位为1表示 回复方


	
	C = 0 读参数
	{
			Addr 为"欧式环控器"参数表中要读参数的起始地址
			DLen , 为要读的数据长度
			
			1. 如要读取设备地址为999(0x3E7)的"欧式环控器",PH模式, 发送如下报文 
			         DTYPE     DADDR        seq 		Len      C     Addr      DLen
				 85 5A  00    E7 03 00 00   01 00       06 00    00    00  00    01 00    CS
				 
				 "欧式环控器"回复 ，PH模式为手动
			         DTYPE     DADDR       seq        Len   	 C     Addr      DLen     Data				 
				 85 5A  00    E7 03 00 00   01 00  	  07 00      80    00  00    01 00    00    CS				 				       
	}
	
	C = 1 写参数
	{
		  Addr 为"欧式环控器"参数表中要写参数的起始地址
			DLen , 为要写的数据长度
			
			1. 如要写设备地址为999(0x3E7)的"欧式环控器",PH模式设置成"自动"

			         DTYPE     DADDR       seq      Len     C     Addr     DLen    Data	 
				 85 5A  00    E7 03 00 00  01 00    07 00   01    00  00    01 00   01   CS
				 
				 "欧式环控器"回复成功只有一个字节长度，内容为0 ， 其他内容为错误

			         DTYPE     DADDR      seq       Len     C     Addr     DLen     Data
				 85 5A  00    E7 03 00 00  01 00    07 00   81    00 00    01 00    00      CS
	}
	
	C = 2 读状态
	{
			Addr 为"欧式环控器"参数表中要读参数的起始地址
			DLen , 为要读的数据长度
			
			1. 如要读取设备地址为999(0x3E7)的"欧式环控器",温度1探头温度, 发送如下报文 
			         DTYPE     DADDR       seq     Len    C    Addr     DLen
				 85 5A  00    E7 03 00 00  01 00   06 00  02   00 00    02  00    CS
				 
				 "欧式环控器"回复 ，温度为 0x100 = 256 即 25.6 摄氏度
			         DTYPE     DADDR       seq     Len    C    Addr     DLen     Data				 
				 85 5A  00    E7 03 00 00  01 00   08 00  82   00 00    02  00   00 01    CS			
	}
	
	C = 3 控制
	{
			
			 M1-M4 = 使用控制器密码RC4加密密文 且其明文 S1 S2 S3 S4 ,S1-S4为 daddrL daddrH mm ss
			 如当前时间为 13:38:40 ,设备地址为999(0x3E7) 那么 S1-S4 为 E7 03 26 28 ，控制器密码为 12 34 56，那么 M1-M4 为 密钥
			 0x123456 使用 RC4 加密的 明文 E7 03 26 28 
			
			1. 读取时间 Addr = 0 
					
				如要读取设备地址为999(0x3E7)的控制器 时间, 发送如下报文 

			         DTYPE     DADDR     seq     Len     C     Addr  	 DLen	  
				 85 5A  00    E7 03 00 00  01 00   06 00   03    00 00   06 00  CS
				
				 控制器回复6字节的时间信息 , 如16年01月10日12时10分22秒

			         DTYPE     DADDR     seq     Len     C     Addr    DLen		Data		 
				 85 5A  00    E7 03 00 00  01 00   0C 00   83    00 00   06 00  16 01 10 12 10 22   CS
				 
		 2. 设置时间 Addr = 1

				如要设置设备地址为999(0x3E7)的控制器 时间为 16年01月10日12时10分22秒, 发送如下报文 

			         DTYPE     DADDR     seq    Len     C    Addr  	 DLen	   Data				 
				 85 5A  00    E7 03 00 00  01 00  0C 00   03   01 00   06 00   16 01 10 12 10 22 CS
				
				 控制器返回

			         DTYPE     DADDR     seq    Len     C    Addr    DLen    Data	 
				 85 5A  00    E7 03 00 00  01 00  07 00   83   01 00   01 00   00(正确)	   	CS
				 																												       01(时间非法)
	}
	
	C = 0x10 登录/读取终端信息/心跳/登出
	{
			1. 终端主动登录服务器 Addr = 0
			{
					  "欧式环控器" 发送报文
						如要控制设备地址为999(0x3E7)的"欧式环控器"发送登录报文
					
							  DTYPE     DADDR    seq    Len     C     Addr    DLen	    Data
				 		85 5A  00   E7 03 00 00  01 00  0B 00   10   00  00   05 00  00 E7 03 00 00 CS	
                                                        							 //00 							(设备类型)
                                                        							//    E7 03 00 00 	(设备地址)
				 		
				 		主站回复
				 		85 5A  00   E7 03 00 00  01 00  07 00   90   00   00  01 00   00 (正确)  CS																																				
			}
			
			2. 服务器读取终端信息
			{
					  主站发送报文  Addr = 0
					  
								  DTYPE     DADDR     seq    Len    C     Addr  	DLen	
				 		85 5A  FF    FF FF FF FF  01 00  07 00  10   00  00   05 00   CS
				 		
				    地址为999(0x3E7)的"欧式环控器"回复
								  DTYPE     DADDR    seq    Len     C     Addr  	DLen	    Data
				 		85 5A  00   E7 03 00 00  01 00  0B 00   90   00  00   05 00   00 E7 03 00 00  CS	
				 																															 // 00 							(设备类型)
				 																															//     E7 03 00 00 	(设备地址)
			}
			
			3. 终端主动发送心跳报文
			{
					  "欧式环控器" 发送报文  Addr = 1
						如要控制设备地址为999(0x3E7)的"欧式环控器"发送心跳报文
					
								  DTYPE     DADDR    seq     Len      C     Addr  	DLen	 Data  
				 		85 5A  00   E7 03 00 00  01 00   07 00    10   01  00   01 00  00    CS	
				 																																				
				 		主站回复
				 		85 5A  00   E7 03 00 00  01 00   07 00    90   01  00   01 00  00 (正确)  CS																																				
			}
			
			4. 终端主动发送登出报文
			{
					  "欧式环控器" 发送报文  Addr = 2
						如要控制设备地址为999(0x3E7)的"欧式环控器"发送登出报文
					
								  DTYPE     DADDR    seq    Len      C     Addr  	 DLen	   Data  
				 		85 5A  00   E7 03 00 00  01 00  07 00    10   02  00   01 00   00    CS	
				 																																				
				 		主站回复
				 		85 5A  00   E7 03 00 00  01 00  07 00    90   02  00   01 00   00 (正确)  CS																																				
			}			
	}	
	
	C = 0x30 文件传送
	{
			1. 读取文件信息 Addr = 00 00
			{
			    主站发送:
			 		85 5A 00 DAddr seq Len 30 00 00 00 00 CS
			 		设备回复
			 		85 5A 00 DAddr seq Len B0 00 00 DLen FileName(32bytes) FileSize(4Bytes) FileCrc16(2Bytes) TotalPart(2Bytes) RecievePart(2bytes) CS 
			 		
			 		DLen = 42 = 0x2A , 此字段为 2A 00
			 		FileName = 设备已接收文件名，以0结束, 如果没有文件，全部为0
			 		FileSize = 文件总长度
			 		FileCrc16 = 文件crc16
			 		RecievePart = 已经接收了的包数。 固定每包最大是1024字节。
			 		TotalPart = 总包数
			}
			2. 写文件信息 Addr = 01 00
			{
			    主站发送:
			 		85 5A 00 DAddr seq Len 30 01 00 28 00 FileName(32bytes) FileSize(4Bytes) FileCrc16(2Bytes) TotalPart(2Bytes) CS
	 				设备回复
	 				85 5A 00 DAddr seq Len B0 01 00 01 00 00 CS 
	 		
	 				设备收到此信息时，会把已接收的包数清0，准备重新接收文件
			}
			3. 发送文件数据 Addr = 02 00
			{
			    主站发送:
			 		85 5A 00 DAddr seq Len 30 02 00 DLen pkgNum(2bytes) pkgdata(<=1024bytes) pkgcrc16(2bytes) CS
			 		设备回复
			 		85 5A 00 DAddr seq Len B0 02 00 01 00 00 CS 
																								01 (包校验错误) 	
																								02 (之前数据包未有接收完成)										

					DLen = 4 + pkgdata的长度													
					pkgNum(2bytes): 本包序号，从0开始
					pkgdata : 本包内容，最大1024字节
					pkgcrc16 : 本包crc16校验													
			}
	}	
}

2. "欧式环控器"参数
{
	#define     MAXTAB_DAY                  10              //温度曲线点数
    #define     NUM_TIMER                   5               //定时输出组数
    #define     NTemp                       3               //有几路温度探头
    #define     NHumi                       1               //有几路湿度探头

    
	typedef struct
	{
	    //温度曲线
	    U16  tempFig_Day[MAXTAB_DAY+1];            //温度曲线日龄 最后一个为自设模式的参数 22
	    U16  tempFig_Target_Day[MAXTAB_DAY+1];     //温度曲线日目标温度 22
	    U16  tempFig_Target_Night[MAXTAB_DAY+1];   //温度曲线夜目标温度 22
	    U16  tempFig_dTempMax[MAXTAB_DAY+1];       //温度曲线最大温差 22
	    U32  tempFig_WindMin[MAXTAB_DAY+1];        //温度曲线最小通风量 44
	    U32  tempFig_WindMax[MAXTAB_DAY+1];        //温度曲线最大通风量 44

		176

	    //制冷--曲线 最后一个为自设模式的参数
	    U16  cool_Day[MAXTAB_DAY+1];               //制冷表日龄 22
	    U16  cool_STime[MAXTAB_DAY+1];             //制冷表开始时间 22
	    U16  cool_ETime[MAXTAB_DAY+1];             //制冷表结束时间 22
	    U16  cool_STemp[MAXTAB_DAY+1];             //温度曲线制冷温度 22
	    U16  cool_ETemp[MAXTAB_DAY+1];             //制冷结束温度 22
	    U16  cool_EHumi[MAXTAB_DAY+1];             //制冷表结束湿度 22
	    U16  cool_On[MAXTAB_DAY+1];                //开分钟 x 10 22
	    U16  cool_Off[MAXTAB_DAY+1];               //关分钟 x 10 22
  
		176

	    //加热 6组 曲线
	    U16  heat_Day[MAXTAB_DAY+1];                //加热日龄表 22
	    U16  heat_STime[MAXTAB_DAY+1];              //加热开始时间 22
	    U16  heat_ETime[MAXTAB_DAY+1];              //加热结束时间 22
	    U16  heat_STemp[MAXTAB_DAY+1];              //加热开始温度 22
	    U16  heat_ETemp[MAXTAB_DAY+1];              //加热结束温度 22
	    U16  heat_On[MAXTAB_DAY+1];                 //开分钟 x 10 22
	    U16  heat_Off[MAXTAB_DAY+1];                //关分钟 x 10 22
	    U16  heat_Percent[MAXTAB_DAY+1];            //变频加热 22

		176 

	    //定时输出
	    U16  timer_On[NUM_TIMER];                   //定时开时间 10
	    U16  timer_Off[NUM_TIMER];                  //定时关时间 10

		20

	    //校准
	    S16  cal_dTemp[NTemp];                      //温度校准差值 6
	    S16  cal_dHumi[NHumi];                      //湿度校准差值 2
	    S16  cal_dNH3;                              //氨气校准差值 2
	    S16  cal_dCO2;                               //CO2校准差值 2
	    U32  cal_Wind;                              //校准最大通风量 4
	    U32  cal_Pulse;                             //校准最大通风量对应脉冲频率 4

		20

	    //数量统计
	    U16  mh_Day;                                //日龄 2
	    U16  mh_PigNum;                             //猪只数量 2
	    U32  mh_PerWind;                            //单位通风量 4
 
		8

	    //模式控制
	    U8  sys_RunMode;                           //0=空舍, 1=生产 1
	    U8  sys_TempMode;                          //0=自设, 1=曲线 1
	    U8  sys_WindMode;                          //0=闭环, 1=比例, 2=固定 1
	    U8  sys_DoorMode;                          //0=变频, 1=继电器, 3=无 1

		4


	    //系统变量
	    U16  sys_FanMin;                        //风机最小开度 2
	    U16  sys_DoorMin;                       //风门最小开度 2
	    U16  sys_WindStep;                      //通风调整风机步长(%) 2
	    U16  sys_DoorStep;                      //通风调整风门步长(%) 2
	    U16  sys_WindTime;                      //通风调整时间 2
	    U16  sys_HumiAdd;                       //高湿增加通风(%) 2
	    U16  sys_HumiHigh;                      //高湿数值 2
	    U16  sys_Humi_Delay;                    //高湿检测时间 2 
	    U16  sys_NH3Add;                        //高氨增加通风(%) 2
	    U16  sys_NH3High;                    //高氨通风延迟xxx.x 分 2
	    U16  sys_NH3_Delay;                   //高氨通风保持xxx.x 分 2
	    U16  sys_CO2Add;                        //高CO2增加通风(%) 2
	    U16  sys_CO2High;                    //高CO2通风延迟xxx.x 分 2
	    U16  sys_CO2_Delay;                   //高CO2通风保持xxx.x 分 2
	    U16  sys_DayStart;                   //日开始时刻 2
	    U16  sys_DayEnd;                     //日结束时刻 2

		32


	    //报警参数
	    U16  alarm_DoorTO;                  //风门超时时间 2
	    U16  alarm_TempMax;					//高温报警 2
	    U16  alarm_TempMin;					//低温报警 2
	    U16  alarm_TempDMax;				//最大报警温差 2
	    U16  alarm_TempDMin;				//最小报警温差 2
	    U16  alarm_HumiMax;					//高湿报警 2
	    U16  alarm_HumiMin;					//低湿报警 2
	    U16  alarm_CO2Max;					//高CO2报警 2
	    U16  alarm_NH3Max;					//高NH3报警 2
	    U32  alarm_WindMin;					//低风量报警 4
	    U8   alarm_TempSensor[NTemp];		//温度探头故障报警 是/否 3
	    U8   alarm_HumiSensor[NHumi];		//湿度探头故障报警 是/否 1
	    U8   alarm_NH3Sensor;				//氨气探头故障报警 是/否 1
	    U8   alarm_CO2Sensor;				//CO2探头故障报警 是/否 1
	    U8   alarm_LostPower;				//掉电报警 是/否 1

	    U32  sys_fixMaxWind;                    //固定最大的通风量 4

		31


	    //通讯设置
	    U32  addr;                               //控制器地址 4
	    U16  serverPort;                         //服务器端口 2
	    U8  serverIP[4];                        //服务器IP地址 4
	    U8  localIP[4];                         //本地IP 4
	    U8  gateway[4];                         //网关 4
	    U8  netmask[4];                         //子网掩码 4
	    U8  comType;                            //0=以太网,1=移动,2=联通,3=电信 1

		23

	}__czqPara;
}

3. "欧式环控器"状态 
{
	typedef struct
	{
	    S16 temp_r[NTemp];      //实际温度 3路
	    U16 humi_r[NHumi];      //实际湿度 1路
	    U16 nh3_r;              //氨气
	    U16 co2_r;              //CO2
	    U32 wind_r;             //通风量
	    U16 temp_avg;           //室内平均温度
	    U16 temp_target;        //目标温度
	    U16 day;                //日龄
	    U8 posFan;               //当前风机百分比
	    U8 posDoor;             //风门位置
	    U8 modeTemp;             //温度控制模式 0-自设 1-曲线
	    U8 modeRun;              //运行模式 0-空舍 1-生产
	    U8 modeCtrl;             //控制模式 0-线性 1-比例 2-固定
	    U8 modeDoor;            //风门模式 0=变频, 1=继电器, 3=无
	    U32 alarmState;         //报警状态，每1bit 表示一种报警 ,该位为0表示无此报警
	                            //该位为1表示有此报警
	    U32 relayState;         //每种类型的继电器对应的开关状态 ,bit0-bit24分别对应如下设备的开关
	                            //bit 00-15  风机1-16
	                            //    16-21  加热1-6
	                            //    22     制冷
	                            //    23     喷雾
	                            //    24     风机4
	    U8  version[16];        //版本号
	    U32 CPUID;              //CPUID
	    U32 FAID;               //FAID
	}__remoteState;
}


4. 文件信息
{
	 typedef struct
	 {
	 		U8 		name[16];			//文件名
	 		U32		totalPart;		//文件总段数
	 		U32   hasPart;			//已接收段数
	 		U32 	totalLen;			//文件总长度
	 		U32		crc16;				//文件内容crc校验
	 }__fileInfo;
}


5. 探头范围
{
	温度 -30.0 - 60.0 
    湿度  0 - 99.9
    氨气  0 - 1000
    CO2   0 - 5000
	
	超出范围，探头数值无效
}